#include <iostream>
#include <algorithm> //算法的头文件
#include <vector>
using namespace std;
/*
    copy copy_if  拷贝
    count count_if  统计
    for_each 遍历容器
    move  移动数据
    remove  remove_if 删除
    replace 替换
    replace_if
    reverse 反转
    sort  排序
    总结：
        第一点：算法(绝大部分)没有办法帮你扩容，如果你的数据越界了，会有段错误的风险
        第二点：容器自带的方法是可以帮你扩容
*/
class Test
{
public:
    bool operator()(int n)
    {
        return n % 2 == 1;
    }
};

bool fun(int n)
{
    cout << "容器数据是: " << n << endl;
    return true;
}

bool sortfun(int n1, int n2)
{
    return n1 > n2; // 降序
}

int main()
{
    int buf[5] = {45, 78, 2, 36, 89};
    vector<int> v1 = {55, 88, 88, 88, 99, 88};
    string str1 = "APPPLLLAAAA";

    // 问题：算法(绝大部分)没有办法帮你扩容，如果你的数据越界了，会有段错误的风险
    // vector<int> v1;  //没有初始化任何数据
    // v1.push_back(89); //push_back属于vector类的成员函数，内部源码会帮你扩容，申请更大的内存空间存放新的数据
    // 拷贝
    // copy(buf,buf+5,v1.begin()); //把buf里面所有的数据拷贝到v1的起始位置

    // 解决方法：
    // vector<int> v1(5);  //5表示最开始给v1对象申请5个类型大小的内存空间
    // vector<int> v1={78,96,79,5,6,12,13,14};
    // 拷贝
    // copy(buf,buf+5,v1.begin());

    // 带条件的拷贝
    // vector<int> v1(5);
    // 写法1：先创建类对象，然后把对象当成参数传递过去
    // Test t1;
    // copy_if(buf,buf+5,v1.begin(),t1);
    // 写法2：使用匿名对象(没有名字的对象--》一般用于函数参数传递)
    // copy_if(buf,buf+5,v1.begin(),Test());

    // 统计
    // auto ret=count(str1.begin(),str1.end(),'A');
    // cout<<"A总共出现: "<<ret<<"次"<<endl;

    // 带条件的统计
    // auto ret=count_if(str1.begin(),str1.end(),[](char n){return (n>='B') && (n<='M');});
    // cout<<"B到M总共出现: "<<ret<<"次"<<endl;

    // 遍历
    // for_each(buf,buf+5,fun);

    // 移动数据
    move(v1.begin(),v1.end(),buf);

    // 删除--》不会改变容器元素个数，容器大小不变
    // 所有的88先删除，然后用删除的结果替换容器前面一部分的数据，后面的数据保持不变
    // remove(v1.begin(),v1.end(),88);
    // remove_if(v1.begin(),v1.end(),[](int n){return n<60;});

    // 替换
    // replace(v1.begin(),v1.end(),88,666); //666替换所有的88
    // replace_if(v1.begin(),v1.end(),[](int n){return n<60;},666);  //666替换所有小于60的数据

    // 逆序--》反转
    // reverse(str1.begin(),str1.end());
    // cout<<"str1 is: "<<str1<<endl;

    // 排序
    // sort(buf,buf+5); //默认升序
    // 降序--》模仿list中sort的写法
    // sort(buf, buf + 5, sortfun);

    for(auto x:v1)
    cout<<"v1里面是： "<<x<<endl;

    for (auto x : buf)
        cout << "buf里面是： " << x << endl;

    return 0;
}